<!DOCTYPE html>
<html lang='en'>

<head>
    <meta charset='UTF-8'>
    <meta name='viewport' content='width=device-width, initial-scale=1.0'>
    <title>Document</title>
    <script src='../vue.js'></script>
</head>

<body>
    <div id='app'>
        <h1>爷爷组件 - {{title}} </h1>
        <father :title="title" :style="{border: '1px solid red'}"></father>

    </div>
</body>

<!-- 
    依赖注入：祖先组件给后代组件传递数据，不管隔了多少层都可以正常接收
    provide：用来提供数据用的，将数据发射出去
    inject: 是用来接收数据用的，可以接收到祖先组件传递的数据
    依赖注入不仅可以传递数据还可以传递函数，后代组件也可以给祖先组件传递数据

    父传子: props
    子传父: 自定义事件
    祖先传后代：依赖注入
    后代传祖先：依赖注入
    无关组件：bus，全局状态管理(pinia,vuex)
-->

<script>


    const son = {
        template: `<div>
            <h1>
            子组件 - {{title}}---{{price}}
        </h1>
        <button @click="parentFn('后代送来了')">传值给父组件</button>
        </div>`,
        props: ['title'],
        // 获取父组件的属性,注入
        inject:['price','parentFn'],

    }


    const father = {
        template: `<h1>
            父组件 - {{title}}
            <son :title='title' :style="{border: '1px solid red'}" />  
        </h1>`,
        props: ['title'],
        components: {
            son
        }
    }


    const app = {
        data() {
            return {
                title: '传家宝',
                price:"dddsg"
            }
        },
        methods: {
            getFromChild(data){
                console.log("后代传值过来的数据:",data)
            }
        },
        provide() {
            return {
                price:this.price,
                parentFn:this.getFromChild,
            }
        },
        components: {
            father
        }
    }
    const vm = Vue.createApp(app).mount('#app')
</script>

</html>